<?php
/**
 * 包含基础的图像操作函数
 * 生成所旅途、生成验证码图
 */
class Image {
	/**
	 * 构造函数
	 */
	function Image() {

	} 

	/**
	 * 把图片生成缩略图1
	 * 
	 * @param string $srcFile 源文件
	 * @param string $dstFile 目标文件
	 * @param int $dstW 目标图片宽度
	 * @param int $dstH 目标文件高度
	 * @param string $dstFormat 目标文件生成的格式, 有png和jpg两种格式
	 * @return 错误返回错误对象
	 */
	function makeThumbPic($srcFile, $dstFile, $dstW, $dstH, $dstFormat = "png") {
		// 打开图片
		$data = GetImageSize($srcFile, &$info);
		switch ($data[2]) {
			case 1: $im = @ImageCreateFromGIF($srcFile);
				break;
			case 2: $im = @imagecreatefromjpeg($srcFile);
				break;
			case 3: $im = @ImageCreateFromPNG($srcFile);
				break;
		} 
		if (!$im) {
			return self :: raiseError("Create image failed", __IMAGE_ERROR_NO, __CLASS__, __METHOD__, __FILE__, __LINE__);
		} 
		// 设定图片大小
		$srcW = ImageSX($im);
		$srcH = ImageSY($im);
		$ni = ImageCreate($dstW, $dstH);
		ImageCopyResized($ni, $im, 0, 0, 0, 0, $dstW, $dstH, $srcW, $srcH); 
		// 生成指定格式的图片
		if ($dstFormat == "png") {
			imagepng($ni, $dstFile);
		} elseif ($dstFormat == "jpg") {
			ImageJpeg($ni, $dstFile);
		} else {
			imagepng($ni, $dstFile);
		} 
	} 

	/**
	 * 把图片生成缩略图2
	 * 
	 * @param string $srcFile 源文件
	 * @param string $dstFile 目标文件
	 * @param int $dstW 目标图片宽度
	 * @param int $dstH 目标文件高度
	 * @return 错误返回错误对象
	 */
	function makeThumbImage($sourFile, $targetFile, $width, $height) {
		$data = getimagesize($sourFile);
		$imageInfo["width"] = $data[0];
		$imageInfo["height"] = $data[1];
		$imageInfo["type"] = $data[2];
		$imageInfo["name"] = basename($sourFile);
		$imageInfo["size"] = filesize($sourFile);
		$newName = substr($sourFile, 0, strrpos($sourFile, ".")) . "_thumb.jpg"; 
		// 打开图片
		switch ($imageInfo["type"]) {
			case 1: $img = imagecreatefromgif($sourFile);
				break;
			case 2: $img = imagecreatefromjpeg($sourFile);
				break;
			case 3: $img = imagecreatefrompng($sourFile);
				break;
			default: return 0;
				break;
		} 
		if (!$img) {
			return self :: raiseError("Create image failed", __IMAGE_ERROR_NO, __CLASS__, __METHOD__, __FILE__, __LINE__);
		} 
		// 图片缩小
		$width = ($width > $imageInfo["width"]) ? $imageInfo["width"] : $width;
		$height = ($height > $imageInfo["height"]) ? $imageInfo["height"] : $height;
		$srcW = $imageInfo["width"];
		$srcH = $imageInfo["height"];

		$height = min(round($srcH * $width / $srcW), $height);
		$width = min(round($srcW * $height / $srcH), $width);

		if (function_exists("imagecreatetruecolor")) { // GD2.0.1
			$new = imagecreatetruecolor($width, $height);
			ImageCopyResampled($new, $img, 0, 0, 0, 0, $width, $height, $imageInfo["width"], $imageInfo["height"]);
		} else {
			$new = imagecreate($width, $height);
			ImageCopyResized($new, $img, 0, 0, 0, 0, $width, $height, $imageInfo["width"], $imageInfo["height"]);
		} 
		// 生成图片
		ImageJPEG($new, $targetFile, 100);
	} 

	/**
	 * PHP图片水印 (水印支持图片或文字)
	 * 
	 * @param string $groundImage 背景图片，即需要加水印的图片，暂只支持GIF,JPG,PNG格式；
	 * @param int $waterPos 水印位置，有10种状态，0为随机位置； 
	 *                    1为顶端居左，2为顶端居中，3为顶端居右； 
	 *                    4为中部居左，5为中部居中，6为中部居右； 
	 *                    7为底端居左，8为底端居中，9为底端居右；
	 * @param string $waterImage 图片水印，即作为水印的图片，暂只支持GIF,JPG,PNG格式；
	 * @param string $waterText 文字水印，即把文字作为为水印，支持ASCII码，不支持中文；
	 * @param string $textFont 文字大小，值为1、2、3、4或5，默认为5；
	 * @param string $textColor 文字颜色，值为十六进制颜色值，默认为#FF0000(红色)；
	 * @return 失败返回错误对象
	 * 
	 * 注意：Support GD 2.0，Support FreeType、GIF Read、GIF Create、JPG 、PNG 
	 *      $waterImage 和 $waterText 最好不要同时使用，选其中之一即可，优先使用 $waterImage。 
	 *      当$waterImage有效时，参数$waterString、$stringFont、$stringColor均不生效。 
	 *      加水印后的图片的文件名和 $groundImage 一样。
	 */
	function makeImageWater($groundImage, $waterPos = 0, $waterImage = "", $waterText = "", $textFont = 5, $textColor = "#FF0000") {
		$isWaterImage = false;
		$formatMsg = "暂不支持该文件格式，请用图片处理软件将图片转换为GIF、JPG、PNG格式。"; 
		// 读取水印文件
		if (!empty($waterImage) && file_exists($waterImage)) {
			$isWaterImage = true;
			$water_info = getimagesize($waterImage);
			$water_w = $water_info[0]; //取得水印图片的宽 
			$water_h = $water_info[1]; //取得水印图片的高 
			
			switch ($water_info[2]) { // 取得水印图片的格式
				case 1:$water_im = imagecreatefromgif($waterImage);
					break;
				case 2:$water_im = imagecreatefromjpeg($waterImage);
					break;
				case 3:$water_im = imagecreatefrompng($waterImage);
					break;
				default:die($formatMsg);
			} 
		} 
		// 读取背景图片
		if (!empty($groundImage) && file_exists($groundImage)) {
			$ground_info = getimagesize($groundImage);
			$ground_w = $ground_info[0]; //取得背景图片的宽 
			$ground_h = $ground_info[1]; //取得背景图片的高 
			
			switch ($ground_info[2]) { // 取得背景图片的格式
				case 1:$ground_im = imagecreatefromgif($groundImage);
					break;
				case 2:$ground_im = imagecreatefromjpeg($groundImage);
					break;
				case 3:$ground_im = imagecreatefrompng($groundImage);
					break;
				default:die($formatMsg);
			} 
		} else {
			return self :: raiseError("需要加水印的图片不存在！", __IMAGE_ERROR_NO, __CLASS__, __METHOD__, __FILE__, __LINE__);
		} 
		// 水印位置
		if ($isWaterImage) { // 图片水印
			$w = $water_w;
			$h = $water_h;
			$label = "图片的";
		} else { // 文字水印
			$temp = imagettfbbox(ceil($textFont * 5), 0, "./cour.ttf", $waterText); //取得使用 TrueType 字体的文本的范围 
			$w = $temp[2] - $temp[6];
			$h = $temp[3] - $temp[7];
			unset($temp);
			$label = "文字区域";
		} 
		if (($ground_w < $w) || ($ground_h < $h)) {
			return self :: raiseError("需要加水印的图片的长度或宽度比水印" . $label . "还小，无法生成水印！", __IMAGE_ERROR_NO, __CLASS__, __METHOD__, __FILE__, __LINE__);
		} 
		switch ($waterPos) {
			case 0:// 随机
				$posX = rand(0, ($ground_w - $w));
				$posY = rand(0, ($ground_h - $h));
				break;
			case 1:// 1为顶端居左
				$posX = 0;
				$posY = 0;
				break;
			case 2:// 2为顶端居中
				$posX = ($ground_w - $w) / 2;
				$posY = 0;
				break;
			case 3:// 3为顶端居右
				$posX = $ground_w - $w;
				$posY = 0;
				break;
			case 4:// 4为中部居左
				$posX = 0;
				$posY = ($ground_h - $h) / 2;
				break;
			case 5:// 5为中部居中
				$posX = ($ground_w - $w) / 2;
				$posY = ($ground_h - $h) / 2;
				break;
			case 6:// 6为中部居右
				$posX = $ground_w - $w;
				$posY = ($ground_h - $h) / 2;
				break;
			case 7:// 7为底端居左
				$posX = 0;
				$posY = $ground_h - $h;
				break;
			case 8:// 8为底端居中
				$posX = ($ground_w - $w) / 2;
				$posY = $ground_h - $h;
				break;
			case 9:// 9为底端居右
				$posX = $ground_w - $w;
				$posY = $ground_h - $h;
				break;
			default:// 随机
				$posX = rand(0, ($ground_w - $w));
				$posY = rand(0, ($ground_h - $h));
				break;
		} 
		// 设定图像的混色模式
		imagealphablending($ground_im, true);

		if ($isWaterImage) { // 图片水印
			imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w, $water_h); //拷贝水印到目标文件       
		} else { // 文字水印
			if (!empty($textColor) && (strlen($textColor) == 7)) {
				$R = hexdec(substr($textColor, 1, 2));
				$G = hexdec(substr($textColor, 3, 2));
				$B = hexdec(substr($textColor, 5));
			} else {
				return self :: raiseError("水印文字颜色格式不正确！", __IMAGE_ERROR_NO, __CLASS__, __METHOD__, __FILE__, __LINE__);
			} 
			imagestring ($ground_im, $textFont, $posX, $posY, $waterText, imagecolorallocate($ground_im, $R, $G, $B));
		} 
		// 生成水印后的图片
		@unlink($groundImage);
		switch ($ground_info[2]) { // 取得背景图片的格式
			case 1: imagegif($ground_im, $groundImage);
				break;
			case 2: imagejpeg($ground_im, $groundImage);
				break;
			case 3: imagepng($ground_im, $groundImage);
				break;
			default: die($errorMsg);
		} 
		// 释放内存
		if (isset($water_info)) unset($water_info);
		if (isset($water_im)) imagedestroy($water_im);
		unset($ground_info);
		imagedestroy($ground_im);
	} 
} 

